"""
Generate header file with macros defining MicroPython version info.

# CIRCUITPY-CHANGE: This script is thoroughly reworked for use with CircuitPython.
This script works with Python 3.7 and newer
"""

from __future__ import print_function

import argparse
import sys
import os
import pathlib
import datetime
import subprocess

# CIRCUITPY-CHANGE: Factor out version computation to py/version.py
import version


# CIRCUITPY-CHANGE
def cannot_determine_version():
    raise SystemExit(
        """Cannot determine version.

CircuitPython must be built from a git clone with tags.
If you cloned from a fork, fetch the tags from adafruit/circuitpython as follows:

    make fetch-tags"""
    )


def make_version_header(repo_path, filename):
    # Get version info using git (required)
    info = version.get_version_info_from_git(repo_path)
    if info is None:
        cannot_determine_version()
    git_tag, git_hash, ver = info
    if len(ver) < 3:
        cannot_determine_version()
    else:
        version_string = ".".join(ver)

    build_date = datetime.date.today()
    if "SOURCE_DATE_EPOCH" in os.environ:
        build_date = datetime.datetime.fromtimestamp(
            int(os.environ["SOURCE_DATE_EPOCH"]), datetime.timezone.utc
        ).date()

    # Generate the file with the git and version info
    # CIRCUITPY-CHANGE: different contents
    file_data = """\
// This file was generated by py/makeversionhdr.py
#define MICROPY_GIT_TAG "%s"
#define MICROPY_GIT_HASH "%s"
#define MICROPY_BUILD_DATE "%s"
#define MICROPY_VERSION_MAJOR (%s)
#define MICROPY_VERSION_MINOR (%s)
#define MICROPY_VERSION_MICRO (%s)
#define MICROPY_VERSION_PRERELEASE 0
#define MICROPY_VERSION_STRING "%s"
// Combined version as a 32-bit number for convenience
#define MICROPY_VERSION (MICROPY_VERSION_MAJOR << 16 | MICROPY_VERSION_MINOR << 8 | MICROPY_VERSION_MICRO)
#define MICROPY_FULL_VERSION_INFO "Adafruit CircuitPython " MICROPY_GIT_TAG " on " MICROPY_BUILD_DATE "; " MICROPY_BANNER_MACHINE
""" % (
        git_tag,
        git_hash,
        build_date.strftime("%Y-%m-%d"),
        ver[0].replace("v", ""),
        ver[1],
        ver[2],
        version_string,
    )

    # Check if the file contents changed from last time
    write_file = True
    if os.path.isfile(filename):
        with open(filename, "r") as f:
            existing_data = f.read()
        if existing_data == file_data:
            write_file = False

    # Only write the file if we need to
    if write_file:
        print("GEN %s" % filename)
        with open(filename, "w") as f:
            f.write(file_data)


def main():
    parser = argparse.ArgumentParser()
    # makeversionheader.py lives in repo/py, so default repo_path to the
    # parent of sys.argv[0]'s directory.
    parser.add_argument(
        "-r",
        "--repo-path",
        default=os.path.join(os.path.dirname(sys.argv[0]), ".."),
        help="path to MicroPython Git repo to query for version",
    )
    parser.add_argument("dest", nargs=1, help="output file path")
    args = parser.parse_args()

    make_version_header(args.repo_path, args.dest[0])


if __name__ == "__main__":
    main()
